<?php

namespace App\Http\Controllers;

use App\Http\Models\Admin;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Redis;

class LoginController extends Controller
{
    //

//    /**
//     * 发送验证码
//     */
//    public function sendCode(){
////        【Gitee】您的验证码是158050，识别码是YUD。请核对识别码再输入验证码，有效期10分钟。
////        5 分钟 300
//
//        $code = rand(100000,999999);
////        setex() 三个参数 键、值 有效期
////        每个人手机号发送值是不一样
//        $key = \request()->post('mobile');
//        Redis::setex($key,600,$code);
//        # 可以发送到手机、可以发送到邮箱里面
//        # 发送方 怎么成为发送方？
//        # 收件方
//        # 根据用户密码查询处理
//        $userInfo = Admin::where()->get();
////         两种形式
////        形式一、
//        session('userInfo',$userInfo);// 利用会话控制存储用户信息
////        形式二
//        Redis::hset('userInfo',$userInfo);// 利用非关系型数据redis中hash存储类型存储用户信息
//
//    }
    /**
     * 验证码
     * 展示登录的视图
     */

    public function login(){
        return view('admin/login');

//        $mobile = \request()->post('mobile');
//        # 验证验证嘛是否过期
//        $code = Redis::get($mobile);
//        if (empty($code)) {
//            echo "验证码已过期";
//        }
//        # 验证验证码是否正确
//        $front_code = \request()->post('code');//表单传送过来
//        if ($code != $front_code) {
//            echo "验证码不正确";
//        }

    }

    /**
     * 发送验证码
     */
    public function sendCode(){
        $mobile = \request()->post('mobile');

        # 验证手机格式
        if (!is_numeric($mobile) && strlen($mobile) != 11) {
            return response()->json([
                'code' => 2001,
                'msg' => '手机号格式不正确',
                'data' => []
            ]);
        }

        # 判断手机号是否禁止
        $errors = Redis::get('error'.$mobile);// 获取当前手机号的错误次数
        if ($errors > 3) {
            return  response()->json([
                'code' => 2005,
                'msg' => '手机号已禁止登录',
                'data' => [],
            ]);
        }

        # 发送验证码 给哪个手机发送短信
        $code = rand(100000,999999);//生成6位的随机数

        # 发送到手机号、可以调用第三方接口。。少一步、调用运营商、可以发送到邮箱

        # 后台接口怎么控制手机 1分钟之内只能发送一次、1一天只能发送10次、利用redis实现 可以百度

        # 每个手机发送一次、需要记录
        $send_times_key = 'send_times_'.$mobile;
        $send_times = Redis::get($send_times_key);
        if ($send_times > 5) {
            return  response()->json([
                'code' => 2006,
                'msg' => '今天发送次数过多、明天在试',
                'data' => [],
            ]);
        }
        if ($send_times) {
            # 有值
            Redis::incr($send_times_key);// 错误次数+1
        } else {
            # 第一次发送之后 24小时之内
            Redis::setex($send_times_key,86400,1);
        }


        # 存储缓存中、为了登录的时候做验证 验证码5分钟内有效
        $key = 'code_'.$mobile;//根据每个手机号、生成一个key
        Redis::setex($key,300,$code);


        return  response()->json([
            'code' => 200,
            'msg' => 'ok',
            'data' => [],
        ]);

    }

    /**
     * 进行登录
     */
    public function doLogin(Request $request){
        $mobile  = $request->post('mobile');
        $password  = $request->post('password');
        $code = $request->post('verifis');// 前端用户输入的验证码
        # 验证验证码是否正确
        # 1、判断手机号是否禁止
        $errors_key = 'error_'.$mobile;
        $errors = Redis::get($errors_key);// 获取当前手机号的错误次数
        if ($errors > 3) {
            return  response()->json([
                'code' => 2005,
                'msg' => '手机号已禁止登录',
                'data' => [],
            ]);
        }
        # 2、验证验证码
        $key = 'code_'.$mobile;//根据每个手机号、生成一个key
        $cache_code = Redis::get($key);// 获取缓存中的验证码、两个进行对比
        if (empty($cache_code)) {
            return  response()->json([
                'code' => 2002,
                'msg' => '验证码已过期',
                'data' => [],
            ]);
        }
        if ($cache_code != $code){
            return  response()->json([
                'code' => 2003,
                'msg' => '验证码不正确',
                'data' => [],
            ]);
        }

        # 验证手机是否存在、密码是否正确。。。
//        (3)密码错误3次以上、手机号不允许登录、错误次数需用redis存储（5分）
        # 第一次登录 密码正确  什么都不用做
        # 3、输入的密码不正确
        $data_password = 'e10adc3949ba59abbe56e057f20f883e';# 数据库的密码
        if (md5($password) != $data_password) {
            if ($errors) {
                # 有值
                Redis::incr($errors_key);// 错误次数+1
            } else {
                # 第一次错误
                Redis::set($errors_key,1);
            }
            return  response()->json([
                'code' => 2004,
                'msg' => 'password 不正确',
                'data' => [],
            ]);
        }


        // 逻辑。。
        # 登录成功之后、利用redis存储用户信息
//        session('mobile',$mobile);
        Redis::hset('userInfo','mobile',$mobile);
        return  response()->json([
            'code' => 200,
            'msg' => 'ok',
            'data' => [],
        ]);
    }

//    Redis  第十二、第十三、第十四
    public function test(){
        $email = \request()->post('email');
//        Mail::raw('Hello, I`m QTX, 文本内容', function($message){
//            $to = '319685606@qq.com';
//            $message->to($to)->subject('纯文本信息邮件测试，标题');
//        });
        $code =  rand(1000,9999);
        Redis::setex($email,600,$code);
        Mail::send("send-mail",['code' =>$code],function ($object) use ($email) {
            $object->to($email)->subject("忘记密码认证");
        });
    }
}
